﻿
namespace Sail {

    /**
     * 给数字加上千分位分隔符
     * @param num
     */
    export function formatNumber(num: any) {
        return String(num).split("").reverse().join("").replace(/(\d{3})(?=[^$])/g, "$1,").split("").reverse().join("");
    }

    /**
     * 把数字转换成汉字金额大写
     * @param n 
     */
    export function digitUppercase(n: number) {
        var fraction = ['角', '分'];
        var digit = [
            '零', '壹', '贰', '叁', '肆',
            '伍', '陆', '柒', '捌', '玖'
        ];
        var unit = [
            ['元', '万', '亿'],
            ['', '拾', '佰', '仟']
        ];
        var head = n < 0 ? '欠' : '';
        n = Math.abs(n);
        var s = '';
        for (var i = 0; i < fraction.length; i++) {
            s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
        }
        s = s || '整';
        n = Math.floor(n);
        for (var i = 0; i < unit[0].length && n > 0; i++) {
            var p = '';
            for (var j = 0; j < unit[1].length && n > 0; j++) {
                p = digit[n % 10] + unit[1][j] + p;
                n = Math.floor(n / 10);
            }
            s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
        }
        return head + s.replace(/(零.)*零元/, '元')
            .replace(/(零.)+/g, '零')
            .replace(/^整$/, '零元整');
    };


    /**
     * 获取预览图片地址
     * @param str
     * @param preType
     */
    export function ToPre(str: string, preType: string) {
        if (!preType) preType = "pre";
        if (!str) return '';
        var pos = str.lastIndexOf("/");
        if (pos >= 0) str = str.substr(0, pos) + "/" + preType + str.substr(pos);
        return str;
    }


    Binder.Helper({
        formatNumber(str: any) { return formatNumber(str); },
        Uppercase(str: any) { return digitUppercase(str); }
    });

    if ($.views) {

        $.views.helpers({
            subString(str: string, n: number) {
                return str.SubStringByByte(n);
            },
            subStringNoHtml(str: string, n: number) {
                return str.RemoveHtmlTag().SubStringByByte(n);
            },
            ToPre(str: string, preType: string) {
                return ToPre(str, preType);
            }
        });
        
        $.views.converters({
            ToPre(str: string) { return ToPre(str, null); },
            ToDate(value: any) { return value ? value.substring(0, 10) : ""; },
            ToFullDateTime(value: any) {
                return value ? DateTime.Parse(value).toLocaleString() : "";
            },
            ToDateHz(value: any) {
                return value ? DateTime.Parse(value).format("yyyy年MM月dd日") : "";
            },
            ToWeekDate(value: any) {
                return value ? DateTime.Parse(value).format("MM月dd日 (ddd)") : "";
            },
            ToDateTime(value: any) {
                return value ? DateTime.Parse(value).format("yyyy年MM月dd日 hh:mm") : "";
            },
            ToDateTime2(value: any) {
                return value ? DateTime.Parse(value).format("yyyy-MM-dd hh:mm:ss") : "";
            },
            intToStr(value: any) {
                return "" + value;
            },
            strToInt(value: any) {
                if (!value) return 0;
                return parseInt(value);
            },
            strToFloat(value: any) {
                if (!value) return 0;
                return parseFloat(value);
            },
            FloatToStr(value: any) {
                return "" + value;
            },
        });
    }
}
